<?xml version="1.0"
      encoding="utf-8"
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>17173 nginx与resin配置说明</title>
<meta name="generator" content="http://txt2tags.org" />
<style type="text/css">
/*

	modern.css - A modern look CSS sample file

	Author : Osvaldo Santana Neto <osantanabr (a) brturbo com>
	Date   : June 2004
	License: GPL

	Part of the txt2tags project <http://txt2tags.org>

*/

body {
	margin: 0px;
	padding: 0px;
	font-family: Verdana, Times, Serif;
}

div.header {
	border-bottom: 2px solid black;
}

div.header h1 {
	float: left;
	margin-left: 12pt;
	font-family: Verdana, Arial, Helvetica, Sans-Serif;
	font-size: 18pt;
	font-weight: bold;
}

div.header h2 {
	text-align: right;
	margin-right: 12pt;
	font-family: Verdana, Arial, Helvetica, Sans-Serif;
	font-size: 8pt;
}

div.header h3 {
	text-align: right;
	margin-right: 12pt;
	margin-bottom: 24pt;
	font-family: Verdana, Arial, Helvetica, Sans-Serif;
	font-size: 8pt;
	font-weight: normal;
}

div.toc {
	float: left;
	width: 20%;
	padding-left: 12pt;
	padding-right: 6pt;
}

div.toc ul {
	padding-left: 6pt;
}

div.toc li {
	font-size: 9pt;
}

div.toc a {
	font-family: Verdana, Arial, Helvetica, Sans-Serif;
	font-size: 14px/1.2;
	font-weight: bold;
	color: #C00;
	text-decoration: none;
}

div.toc a:hover {
	text-decoration: underline;
}

div.body {
	float: right;
	width: 75%;
	padding: 10px;
	border-left: 2px dotted black;
	text-align: justify;
}

div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 {
	font-family: Verdana, Arial, Helvetica, Sans-Serif;
}

div.body h1 {
	text-align: left;
	margin-top: 24pt;
	margin-bottom: 18pt;
	font-size: 12pt;
	border-left: 4px solid black;
	border-bottom: 2px solid black;
	padding: 5px;
	background: #F0F0F0;
}

div.body h2 {
	text-align: left;
	margin-top: 24pt;
	margin-bottom: 18pt;
	font-size: 12pt;
	font-weight: normal;
	border-left: 4px solid black;
	border-bottom: 1px solid black;
	padding: 5px;
	background: #F0F0F0;
}

div.body h3 {
	text-align: left;
	margin-top: 24pt;
	margin-bottom: 16pt;
	font-size: 8pt;
	border-left: 1px solid black;
	border-bottom: 1px solid black;
	padding: 5px;
	background: #F0F0F0;
}

div.body h4 {
	text-align: left;
	margin-top: 24pt;
	margin-bottom: 16pt;
	font-size: 8pt;
	font-weight: normal;
	border-left: 1px solid black;
	border-bottom: 1px solid black;
	padding: 5px;
}

div.body h5 {
	width: 80%;
	text-align: left;
	margin-top: 6pt;
	margin-bottom: 16pt;
	font-size: 8pt;
	padding: 5px;
}


div.body a {
	font-family: Verdana;
	font-size: 10pt;
	text-decoration: none;
	color: #C00;
}

div.body a:hover {
	text-decoration: underline;
}

div.body blockquote {
	border-top: 2px solid black;
	border-bottom: 2px solid black;
	background: #FFFFBB;
	padding: 15px;
}
div.body blockquote p {
	margin-top: 2pt;
	margin-bottom: 2pt;
}

div.body pre {
	background: #FFFFBB;
	padding: 15px;
	border: 1px dashed black;
}

div.body dt {
	background: #BBFFBB;
	padding: 3pt;
	border-left: 3px solid black;
	font-family: Verdana, Arial, Helvetica, Sans-Serif;
	font-size: 10pt;
	margin-top: 18pt;
	margin-bottom: 8pt;
}


p, li, td {
	font-family: Verdana;
	font-size: 14px;
	line-height: 21px;
}
div.toc ul a {
	font-size: 14px;
	font-weight: bold;
}
div.toc ul ul a {
	font-size: 12px;
	font-weight: normal;
}
div.toc ul li {
	margin-top: 10px;
}
div.toc ul ul li {
	margin-top: auto;
}

/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 * 
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
.syntaxhighlighter a,
.syntaxhighlighter div,
.syntaxhighlighter code,
.syntaxhighlighter table,
.syntaxhighlighter table td,
.syntaxhighlighter table tr,
.syntaxhighlighter table tbody,
.syntaxhighlighter table thead,
.syntaxhighlighter table caption,
.syntaxhighlighter textarea {
  -moz-border-radius: 0 0 0 0 !important;
  -webkit-border-radius: 0 0 0 0 !important;
  background: none !important;
  border: 0 !important;
  bottom: auto !important;
  float: none !important;
  height: auto !important;
  left: auto !important;
  line-height: 1.1em !important;
  margin: 0 !important;
  outline: 0 !important;
  overflow: visible !important;
  padding: 0 !important;
  position: static !important;
  right: auto !important;
  text-align: left !important;
  top: auto !important;
  vertical-align: baseline !important;
  width: auto !important;
  box-sizing: content-box !important;
  font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
  font-weight: normal !important;
  font-style: normal !important;
  font-size: 1em !important;
  min-height: inherit !important;
  min-height: auto !important;
}

.syntaxhighlighter {
  width: 100% !important;
  margin: 1em 0 1em 0 !important;
  position: relative !important;
  overflow: auto !important;
  font-size: 1em !important;
}
.syntaxhighlighter.source {
  overflow: hidden !important;
}
.syntaxhighlighter .bold {
  font-weight: bold !important;
}
.syntaxhighlighter .italic {
  font-style: italic !important;
}
.syntaxhighlighter .line {
  white-space: pre !important;
}
.syntaxhighlighter table {
  width: 100% !important;
}
.syntaxhighlighter table caption {
  text-align: left !important;
  padding: .5em 0 0.5em 1em !important;
}
.syntaxhighlighter table td.code {
  width: 100% !important;
}
.syntaxhighlighter table td.code .container {
  position: relative !important;
}
.syntaxhighlighter table td.code .container textarea {
  box-sizing: border-box !important;
  position: absolute !important;
  left: 0 !important;
  top: 0 !important;
  width: 100% !important;
  height: 100% !important;
  border: none !important;
  background: white !important;
  padding-left: 1em !important;
  overflow: hidden !important;
  white-space: pre !important;
}
.syntaxhighlighter table td.gutter .line {
  text-align: right !important;
  padding: 0 0.5em 0 1em !important;
}
.syntaxhighlighter table td.code .line {
  padding: 0 1em !important;
}
.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
  padding-left: 0em !important;
}
.syntaxhighlighter.show {
  display: block !important;
}
.syntaxhighlighter.collapsed table {
  display: none !important;
}
.syntaxhighlighter.collapsed .toolbar {
  padding: 0.1em 0.8em 0em 0.8em !important;
  font-size: 1em !important;
  position: static !important;
  width: auto !important;
  height: auto !important;
}
.syntaxhighlighter.collapsed .toolbar span {
  display: inline !important;
  margin-right: 1em !important;
}
.syntaxhighlighter.collapsed .toolbar span a {
  padding: 0 !important;
  display: none !important;
}
.syntaxhighlighter.collapsed .toolbar span a.expandSource {
  display: inline !important;
}
.syntaxhighlighter .toolbar {
  position: absolute !important;
  right: 1px !important;
  top: 1px !important;
  width: 11px !important;
  height: 11px !important;
  font-size: 10px !important;
  z-index: 10 !important;
}
.syntaxhighlighter .toolbar span.title {
  display: inline !important;
}
.syntaxhighlighter .toolbar a {
  display: block !important;
  text-align: center !important;
  text-decoration: none !important;
  padding-top: 1px !important;
}
.syntaxhighlighter .toolbar a.expandSource {
  display: none !important;
}
.syntaxhighlighter.ie {
  font-size: .9em !important;
  padding: 1px 0 1px 0 !important;
}
.syntaxhighlighter.ie .toolbar {
  line-height: 8px !important;
}
.syntaxhighlighter.ie .toolbar a {
  padding-top: 0px !important;
}
.syntaxhighlighter.printing .line.alt1 .content,
.syntaxhighlighter.printing .line.alt2 .content,
.syntaxhighlighter.printing .line.highlighted .number,
.syntaxhighlighter.printing .line.highlighted.alt1 .content,
.syntaxhighlighter.printing .line.highlighted.alt2 .content {
  background: none !important;
}
.syntaxhighlighter.printing .line .number {
  color: #bbbbbb !important;
}
.syntaxhighlighter.printing .line .content {
  color: black !important;
}
.syntaxhighlighter.printing .toolbar {
  display: none !important;
}
.syntaxhighlighter.printing a {
  text-decoration: none !important;
}
.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
  color: black !important;
}
.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
  color: #008200 !important;
}
.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
  color: blue !important;
}
.syntaxhighlighter.printing .keyword {
  color: #006699 !important;
  font-weight: bold !important;
}
.syntaxhighlighter.printing .preprocessor {
  color: gray !important;
}
.syntaxhighlighter.printing .variable {
  color: #aa7700 !important;
}
.syntaxhighlighter.printing .value {
  color: #009900 !important;
}
.syntaxhighlighter.printing .functions {
  color: #ff1493 !important;
}
.syntaxhighlighter.printing .constants {
  color: #0066cc !important;
}
.syntaxhighlighter.printing .script {
  font-weight: bold !important;
}
.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
  color: gray !important;
}
.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
  color: #ff1493 !important;
}
.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
  color: red !important;
}
.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
  color: black !important;
}

/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 * 
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
.syntaxhighlighter {
  background-color: white !important;
}
.syntaxhighlighter .line.alt1 {
  background-color: white !important;
}
.syntaxhighlighter .line.alt2 {
  background-color: white !important;
}
.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
  background-color: #e0e0e0 !important;
}
.syntaxhighlighter .line.highlighted.number {
  color: black !important;
}
.syntaxhighlighter table caption {
  color: black !important;
}
.syntaxhighlighter .gutter {
  color: #afafaf !important;
}
.syntaxhighlighter .gutter .line {
  border-right: 3px solid #6ce26c !important;
}
.syntaxhighlighter .gutter .line.highlighted {
  background-color: #6ce26c !important;
  color: white !important;
}
.syntaxhighlighter.printing .line .content {
  border: none !important;
}
.syntaxhighlighter.collapsed {
  overflow: visible !important;
}
.syntaxhighlighter.collapsed .toolbar {
  color: blue !important;
  background: white !important;
  border: 1px solid #6ce26c !important;
}
.syntaxhighlighter.collapsed .toolbar a {
  color: blue !important;
}
.syntaxhighlighter.collapsed .toolbar a:hover {
  color: red !important;
}
.syntaxhighlighter .toolbar {
  color: white !important;
  background: #6ce26c !important;
  border: none !important;
}
.syntaxhighlighter .toolbar a {
  color: white !important;
}
.syntaxhighlighter .toolbar a:hover {
  color: black !important;
}
.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
  color: black !important;
}
.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
  color: #008200 !important;
}
.syntaxhighlighter .string, .syntaxhighlighter .string a {
  color: blue !important;
}
.syntaxhighlighter .keyword {
  color: #006699 !important;
}
.syntaxhighlighter .preprocessor {
  color: gray !important;
}
.syntaxhighlighter .variable {
  color: #aa7700 !important;
}
.syntaxhighlighter .value {
  color: #009900 !important;
}
.syntaxhighlighter .functions {
  color: #ff1493 !important;
}
.syntaxhighlighter .constants {
  color: #0066cc !important;
}
.syntaxhighlighter .script {
  font-weight: bold !important;
  color: #006699 !important;
  background-color: none !important;
}
.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
  color: gray !important;
}
.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
  color: #ff1493 !important;
}
.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
  color: red !important;
}

.syntaxhighlighter .keyword {
  font-weight: bold !important;
}

.syntaxhighlighter code {
	font-size: 14px !important;
	line-height: 17px !important;
}

</style>
<script type="text/javascript">
/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 * 
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a<f.L;a++)I(f[a]===e)H a;H-1}M=6(f,e){K a=[],b=M.1B,c=0,d,h;I(M.1R(f)){I(e!==1d)1S 3m("2a\'t 5r 5I 5F 5B 5C 15 5E 5p");H r(f)}I(v)1S 2U("2a\'t W 3l M 59 5m 5g 5x 5i");e=e||"";O(d={2N:11,19:[],2K:6(g){H e.1i(g)>-1},3d:6(g){e+=g}};c<f.L;)I(h=B(f,c,b,d)){a.U(h.3k);c+=h.1C[0].L||1}Y I(h=n.X.W(z[b],f.1a(c))){a.U(h[0]);c+=h[0].L}Y{h=f.3a(c);I(h==="[")b=M.2I;Y I(h==="]")b=M.1B;a.U(h);c++}a=15(a.1K(""),n.Q.W(e,w,""));a.1w={1m:f,19:d.2N?d.19:N};H a};M.3v="1.5.0";M.2I=1;M.1B=2;K C=/\\$(?:(\\d\\d?|[$&`\'])|{([$\\w]+)})/g,w=/[^5h]+|([\\s\\S])(?=[\\s\\S]*\\1)/g,A=/^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,v=11,u=[],n={X:15.Z.X,1A:15.Z.1A,1C:1r.Z.1C,Q:1r.Z.Q,1e:1r.Z.1e},x=n.X.W(/()??/,"")[1]===1d,D=6(){K f=/^/g;n.1A.W(f,"");H!f.12}(),y=6(){K f=/x/g;n.Q.W("x",f,"");H!f.12}(),E=15.Z.3n!==1d,z={};z[M.2I]=/^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S]))/;z[M.1B]=/^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/;M.1h=6(f,e,a,b){u.U({2q:r(f,"g"+(E?"y":"")),2b:e,3r:a||M.1B,2p:b||N})};M.2n=6(f,e){K a=f+"/"+(e||"");H M.2n[a]||(M.2n[a]=M(f,e))};M.3c=6(f){H r(f,"g")};M.5l=6(f){H f.Q(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,"\\\\$&")};M.5e=6(f,e,a,b){e=r(e,"g"+(b&&E?"y":""));e.12=a=a||0;f=e.X(f);H b?f&&f.P===a?f:N:f};M.3q=6(){M.1h=6(){1S 2U("2a\'t 55 1h 54 3q")}};M.1R=6(f){H 53.Z.1q.W(f)==="[2m 15]"};M.3p=6(f,e,a,b){O(K c=r(e,"g"),d=-1,h;h=c.X(f);){a.W(b,h,++d,f,c);c.12===h.P&&c.12++}I(e.1J)e.12=0};M.57=6(f,e){H 6 a(b,c){K d=e[c].1I?e[c]:{1I:e[c]},h=r(d.1I,"g"),g=[],i;O(i=0;i<b.L;i++)M.3p(b[i],h,6(k){g.U(d.3j?k[d.3j]||"":k[0])});H c===e.L-1||!g.L?g:a(g,c+1)}([f],0)};15.Z.1p=6(f,e){H J.X(e[0])};15.Z.W=6(f,e){H J.X(e)};15.Z.X=6(f){K e=n.X.1p(J,14),a;I(e){I(!x&&e.L>1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;b<e.L;b++)I(a=J.1w.19[b-1])e[a]=e[b];!D&&J.1J&&!e[0].L&&J.12>e.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;d<b.L;d++)I(b[d])14[0][b[d]]=14[d+1]}I(a&&f.1J)f.12=14[14.L-2]+14[0].L;H e.1p(N,14)});Y{c=J+"";c=n.Q.W(c,f,6(){K d=14;H n.Q.W(e,C,6(h,g,i){I(g)5b(g){24"$":H"$";24"&":H d[0];24"`":H d[d.L-1].1a(0,d[d.L-2]);24"\'":H d[d.L-1].1a(d[d.L-2]+d[0].L);5a:i="";g=+g;I(!g)H h;O(;g>d.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P<a.L&&3b.Z.U.1p(b,d.1a(1));h=d[0].L;c=f.12;I(b.L>=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a<d.L&&i==N;a++)i=p(d[a],b,c);H i}6 C(a,b){K c={},d;O(d 2g a)c[d]=a[d];O(d 2g b)c[d]=b[d];H c}6 w(a,b,c,d){6 h(g){g=g||1P.5y;I(!g.1F){g.1F=g.52;g.3N=6(){J.5w=11}}c.W(d||1P,g)}a.3g?a.3g("4U"+b,h):a.4y(b,h,11)}6 A(a,b){K c=e.1Y.2j,d=N;I(c==N){c={};O(K h 2g e.1U){K g=e.1U[h];d=g.4x;I(d!=N){g.1V=h.4w();O(g=0;g<d.L;g++)c[d[g]]=h}}e.1Y.2j=c}d=e.1U[c[a]];d==N&&b!=11&&1P.1X(e.13.1x.1X+(e.13.1x.3E+a));H d}6 v(a,b){O(K c=a.1e("\\n"),d=0;d<c.L;d++)c[d]=b(c[d],d);H c.1K("\\n")}6 u(a,b){I(a==N||a.L==0||a=="\\n")H a;a=a.Q(/</g,"&1y;");a=a.Q(/ {2,}/g,6(c){O(K d="",h=0;h<c.L-1;h++)d+=e.13.1W;H d+" "});I(b!=N)a=v(a,6(c){I(c.L==0)H"";K d="";c=c.Q(/^(&2s;| )+/,6(h){d=h;H""});I(c.L==0)H d;H d+\'<17 1g="\'+b+\'">\'+c+"</17>"});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+="                    ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.P<b.P)H-1;Y I(a.P>b.P)H 1;Y I(a.L<b.L)H-1;Y I(a.L>b.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'<a 2h="\'+c+\'">\'+c+"</a>"+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<a.L;c++)a[c].3s=="20"&&b.U(a[c]);H b}6 f(a){a=a.1F;K b=p(a,".20",R);a=p(a,".3O",R);K c=1E.4i("3t");I(!(!a||!b||p(a,"3t"))){B(b.1c);r(b,"1m");O(K d=a.3G,h=[],g=0;g<d.L;g++)h.U(d[g].4z||d[g].4A);h=h.1K("\\r");c.39(1E.4D(h));a.39(c);c.2C();c.4C();w(c,"4u",6(){c.2G.4E(c);b.1l=b.1l.Q("1m","")})}}I(1j 3F!="1d"&&1j M=="1d")M=3F("M").M;K e={2v:{"1g-27":"","2i-1s":1,"2z-1s-2t":11,1M:N,1t:N,"42-45":R,"43-22":4,1u:R,16:R,"3V-17":R,2l:11,"41-40":R,2k:11,"1z-1k":11},13:{1W:"&2s;",2M:R,46:11,44:11,34:"4n",1x:{21:"4o 1m",2P:"?",1X:"1v\\n\\n",3E:"4r\'t 4t 1D O: ",4g:"4m 4B\'t 51 O 1z-1k 4F: ",37:\'<!4T 1z 4S "-//4V//3H 4W 1.0 4Z//4Y" "1Z://2y.3L.3K/4X/3I/3H/3I-4P.4J"><1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v</1t></3J><3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;"><T 1L="2O-3D:3C;3w-32:1.6z;"><T 1L="25-22:6A-6E;">1v</T><T 1L="25-22:.6C;3w-6B:6R;"><T>3v 3.0.76 (72 73 3x)</T><T><a 2h="1Z://3u.2w/1v" 1F="38" 1L="2f:#3y">1Z://3u.2w/1v</a></T><T>70 17 6U 71.</T><T>6T 6X-3x 6Y 6D.</T></T><T>6t 61 60 J 1k, 5Z <a 2h="6u://2y.62.2w/63-66/65?64=5X-5W&5P=5O" 1L="2f:#3y">5R</a> 5V <2R/>5U 5T 5S!</T></T></3B></1z>\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'<T 1g="16">\',d=e.16.2x,h=d.2X,g=0;g<h.L;g++)c+=(d[h[g]].1H||b)(a,h[g]);c+="</T>";H c},2o:6(a,b,c){H\'<2W><a 2h="#" 1g="6e 6h\'+b+" "+b+\'">\'+c+"</a></2W>"},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h<c.L;h++)d.U(c[h]);c=d}c=c;d=[];I(e.13.2M)c=c.1O(z());I(c.L===0)H d;O(h=0;h<c.L;h++){O(K g=c[h],i=a,k=c[h].1l,j=3W 0,l={},m=1f M("^\\\\[(?<2V>(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g<c.L;g++){b=c[g];K i=b.1F,k=b.1n,j=k.1D,l;I(j!=N){I(k["1z-1k"]=="R"||e.2v["1z-1k"]==R){d=1f e.4l(j);j="4O"}Y I(d=A(j))d=1f d;Y 6H;l=i.3X;I(h.2M){l=l;K m=x(l),s=11;I(m.1i("<![6G[")==0){m=m.4h(9);s=R}K o=m.L;I(m.1i("]]\\>")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;m<j.L;m++)j[m].P+=l}K c=A(a),d,h=1f e.1U.5Y,g=J,i="2F 1H 2Q".1e(" ");I(c!=N){d=1f c;O(K k=0;k<i.L;k++)(6(){K j=i[k];g[j]=6(){H h[j].1p(h,14)}})();d.28==N?1P.1X(e.13.1x.1X+(e.13.1x.4g+a)):h.2J.U({1I:d.28.17,2D:6(j){O(K l=j.17,m=[],s=d.2J,o=j.P+j.18.L,F=d.28,q,G=0;G<s.L;G++){q=y(l,s[G]);b(q,o);m=m.1O(q)}I(F.18!=N&&j.18!=N){q=y(j.18,F.18);b(q,j.P);m=m.1O(q)}I(F.1b!=N&&j.1b!=N){q=y(j.1b,F.1b);b(q,j.P+j[0].5Q(j.1b));m=m.1O(q)}O(j=0;j<m.L;j++)m[j].1V=c.1V;H m}})}};e.4j=6(){};e.4j.Z={V:6(a,b){K c=J.1n[a];c=c==N?b:c;K d={"R":R,"11":11}[c];H d==N?c:d},3Y:6(a){H 1E.4i(a)},4c:6(a,b){K c=[];I(a!=N)O(K d=0;d<a.L;d++)I(1j a[d]=="2m")c=c.1O(y(b,a[d]));H J.4e(c.6b(D))},4e:6(a){O(K b=0;b<a.L;b++)I(a[b]!==N)O(K c=a[b],d=c.P+c.L,h=b+1;h<a.L&&a[b]!==N;h++){K g=a[h];I(g!==N)I(g.P>d)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P<d)a[h]=N}H a},4d:6(a){K b=[],c=2u(J.V("2i-1s"));v(a,6(d,h){b.U(h+c)});H b},3U:6(a){K b=J.V("1M",[]);I(1j b!="2m"&&b.U==N)b=[b];a:{a=a.1q();K c=3W 0;O(c=c=1Q.6c(c||0,0);c<b.L;c++)I(b[c]==a){b=c;1N a}b=-1}H b!=-1},2r:6(a,b,c){a=["1s","6i"+b,"P"+a,"6r"+(b%2==0?1:2).1q()];J.3U(b)&&a.U("67");b==0&&a.U("1N");H\'<T 1g="\'+a.1K(" ")+\'">\'+c+"</T>"},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i<d;i++){K k=b?b[i]:h+i,j;I(k==0)j=e.13.1W;Y{j=g;O(K l=k.1q();l.L<j;)l="0"+l;j=l}a=j;c+=J.2r(i,k,a)}H c},49:6(a,b){a=x(a);K c=a.1e("\\n");J.V("2z-1s-2t");K d=2u(J.V("2i-1s"));a="";O(K h=J.V("1D"),g=0;g<c.L;g++){K i=c[g],k=/^(&2s;|\\s)+/.X(i),j=N,l=b?b[g]:d+g;I(k!=N){j=k[0].1q();i=i.1o(j.L);j=j.Q(" ",e.13.1W)}i=x(i);I(i.L==0)i=e.13.1W;a+=J.2r(g,l,(j!=N?\'<17 1g="\'+h+\' 5N">\'+j+"</17>":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"</4a>":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i<b.L;i++){K k=b[i],j;I(!(k===N||k.L===0)){j=c(k);h+=u(a.1o(d,k.P-d),j+"48")+u(k.1T,j+k.23);d=k.P+k.L+(k.75||0)}}h+=u(a.1o(d),c()+"48");H h},1H:6(a){K b="",c=["20"],d;I(J.V("2k")==R)J.1n.16=J.1n.1u=11;1l="20";J.V("2l")==R&&c.U("47");I((1u=J.V("1u"))==11)c.U("6S");c.U(J.V("1g-27"));c.U(J.V("1D"));a=a.Q(/^[ ]*[\\n]+|[\\n]*[ ]*$/g,"").Q(/\\r/g," ");b=J.V("43-22");I(J.V("42-45")==R)a=n(a,b);Y{O(K h="",g=0;g<b;g++)h+=" ";a=a.Q(/\\t/g,h)}a=a;a:{b=a=a;h=/<2R\\s*\\/?>|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i<b.L&&g>0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i<b.L;i++)b[i]=b[i].1o(g);a=b.1K("\\n")}I(1u)d=J.4d(a);b=J.4c(J.2J,a);b=J.4b(a,b);b=J.49(b,d);I(J.V("41-40"))b=E(b);1j 2H!="1d"&&2H.3S&&2H.3S.1C(/5s/)&&c.U("5t");H b=\'<T 1c="\'+t(J.1c)+\'" 1g="\'+c.1K(" ")+\'">\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"</2d>":"")+\'<2d 1g="17"><T 1g="3O">\'+b+"</T></2d></3P></3T></3Z></T>"},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{}))

/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 * 
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
;(function()
{
	// CommonJS
	typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;

	function Brush()
	{
		function process(match, regexInfo)
		{
			var constructor = SyntaxHighlighter.Match,
				code = match[0],
				tag = new XRegExp('(&lt;|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),
				result = []
				;
		
			if (match.attributes != null) 
			{
				var attributes,
					regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' +
										'\\s*=\\s*' +
										'(?<value> ".*?"|\'.*?\'|\\w+)',
										'xg');

				while ((attributes = regex.exec(code)) != null) 
				{
					result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));
					result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));
				}
			}

			if (tag != null)
				result.push(
					new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword')
				);

			return result;
		}
	
		this.regexList = [
			{ regex: new XRegExp('(\\&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\&gt;|>)', 'gm'),			css: 'color2' },	// <![ ... [ ... ]]>
			{ regex: SyntaxHighlighter.regexLib.xmlComments,												css: 'comments' },	// <!-- ... -->
			{ regex: new XRegExp('(&lt;|<)[\\s\\/\\?]*(\\w+)(?<attributes>.*?)[\\s\\/\\?]*(&gt;|>)', 'sg'), func: process }
		];
	};

	Brush.prototype	= new SyntaxHighlighter.Highlighter();
	Brush.aliases	= ['xml', 'xhtml', 'xslt', 'html'];

	SyntaxHighlighter.brushes.Xml = Brush;

	// CommonJS
	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
})();

/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 * 
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
;(function()
{
	// CommonJS
	typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;

	function Brush()
	{
		var keywords =	'if fi then elif else for do done until while break continue case function return in eq ne ge le';
		var commands =  'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' +
						'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' +
						'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' +
						'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' +
						'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' +
						'import install join kill less let ln local locate logname logout look lpc lpr lprint ' +
						'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' +
						'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' +
						'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' +
						'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' +
						'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' +
						'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' +
						'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' +
						'vi watch wc whereis which who whoami Wget xargs yes'
						;

		this.regexList = [
			{ regex: /^#!.*$/gm,											css: 'preprocessor bold' },
			{ regex: /\/[\w-\/]+/gm,										css: 'plain' },
			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,		css: 'comments' },		// one line comments
			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,			css: 'string' },		// double quoted strings
			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,			css: 'string' },		// single quoted strings
			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),			css: 'keyword' },		// keywords
			{ regex: new RegExp(this.getKeywords(commands), 'gm'),			css: 'functions' }		// commands
			];
	}

	Brush.prototype	= new SyntaxHighlighter.Highlighter();
	Brush.aliases	= ['bash', 'shell'];

	SyntaxHighlighter.brushes.Bash = Brush;

	// CommonJS
	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
})();

SyntaxHighlighter.defaults['gutter'] = false;
SyntaxHighlighter.all();
</script>
<body>

<div class="header" id="header">
<h1>17173 nginx与resin配置说明</h1>
<h2>Zhikuan Lin(zhikuanlin@sohu-inc.com)</h2>
<h3>2011-04-26 14:59:20</h3>
</div>

<div class="toc">

  <ul>
  <li><a href="#toc1">1. 概述</a>
    <ul>
    <li><a href="#toc2">1.1. 配置目标</a>
    </li>
    <li><a href="#toc3">1.2. 关于jvm和webapp的说明</a>
    </li>
    <li><a href="#toc4">1.3. jvm及ftp用户命名规范</a>
    </li>
    <li><a href="#toc5">1.4. jvm主目录结构说明</a>
    </li>
    </ul>
  </li>
  <li><a href="#toc6">2. 软件的安装</a>
    <ul>
    <li><a href="#toc7">2.1. 安装nginx</a>
    </li>
    <li><a href="#toc8">2.2. 安装JDK</a>
    </li>
    <li><a href="#toc9">2.3. 安装Resin</a>
    </li>
    <li><a href="#toc10">2.4. 设定环境变量</a>
    </li>
    <li><a href="#toc11">2.5. 初始化目录</a>
    </li>
    </ul>
  </li>
  <li><a href="#toc12">3. 配置实例: 新增加一个全新host和jvm</a>
    <ul>
    <li><a href="#toc13">3.1. 添加用户</a>
    </li>
    <li><a href="#toc14">3.2. 建立jvm和webapp目录结构</a>
    </li>
    <li><a href="#toc15">3.3. 建立jmx密码文件</a>
    </li>
    <li><a href="#toc16">3.4. 在resin中添加相应配置</a>
      <ul>
      <li><a href="#toc17">3.4.1. resin.conf配置</a>
      </li>
      <li><a href="#toc18">3.4.2. 启动和关闭resin-server</a>
      </li>
      </ul>
    </li>
    <li><a href="#toc19">3.5. 在nginx中添加相应配置</a>
      <ul>
      <li><a href="#toc20">3.5.1. nginx.conf配置</a>
      </li>
      <li><a href="#toc21">3.5.2. 添加host配置文件</a>
      </li>
      <li><a href="#toc22">3.5.3. 关于javaweb.conf的说明</a>
      </li>
      </ul>
    </li>
    </ul>
  </li>
  <li><a href="#toc23">4. 配置实例: 新增加一个jvm</a>
    <ul>
    <li><a href="#toc24">4.1. 添加用户</a>
    </li>
    <li><a href="#toc25">4.2. 建立jvm和webapp目录结构</a>
    </li>
    <li><a href="#toc26">4.3. 建立jmx密码文件</a>
    </li>
    <li><a href="#toc27">4.4. 在resin中添加相应配置</a>
      <ul>
      <li><a href="#toc28">4.4.1. resin.conf配置</a>
      </li>
      <li><a href="#toc29">4.4.2. 启动和关闭resin-server</a>
      </li>
      </ul>
    </li>
    <li><a href="#toc30">4.5. 在nginx中添加相应配置</a>
      <ul>
      <li><a href="#toc31">4.5.1. nginx.conf配置</a>
      </li>
      <li><a href="#toc32">4.5.2. host.conf配置</a>
      </li>
      </ul>
    </li>
    </ul>
  </li>
  <li><a href="#toc33">5. 配置实例: 往已有jvm添加新的webapp</a>
    <ul>
    <li><a href="#toc34">5.1. 建立webapp目录结构</a>
    </li>
    <li><a href="#toc35">5.2. resin.conf配置</a>
    </li>
    <li><a href="#toc36">5.3. nginx配置</a>
    </li>
    </ul>
  </li>
  <li><a href="#toc37">6. 常用配置参数说明</a>
    <ul>
    <li><a href="#toc38">6.1. resin常用配置参数说明</a>
      <ul>
      <li><a href="#toc39">6.1.1. dependency-check-interval</a>
      </li>
      <li><a href="#toc40">6.1.2. resin-server: jvm参数</a>
      </li>
      <li><a href="#toc41">6.1.3. resin-server: 常规参数</a>
      </li>
      <li><a href="#toc42">6.1.4. resin-server: 运行身份</a>
      </li>
      <li><a href="#toc43">6.1.5. web-app: Session和Cookie配置</a>
      </li>
      <li><a href="#toc44">6.1.6. host: 日志配置</a>
      </li>
      <li><a href="#toc45">6.1.7. 故障排查技巧</a>
      </li>
      <li><a href="#toc46">6.1.8. 参考文档</a>
      </li>
      </ul>
    </li>
    <li><a href="#toc47">6.2. nginx常用配置说明</a>
    </li>
    <li><a href="#toc48">6.3. 运行身份</a>
    </li>
    <li><a href="#toc49">6.4. access和error日志</a>
    </li>
    <li><a href="#toc50">6.5. 设置proxy请求的header</a>
    </li>
    </ul>
  </li>
  </ul>

</div>
<div class="body" id="body">

<a id="toc1" name="toc1"></a>
<h1>1. 概述</h1>

<a id="toc2" name="toc2"></a>
<h2>1.1. 配置目标</h2>

<ul>
<li>nginx和resin均采用nobody身份运行;
</li>
<li>resin没有权限往webapp目录写文件;
</li>
<li>用户使用指定账户通过ftp往webapp目录上传程序文件(.class和.jsp);
</li>
<li>在每台物理服务器上都有一个resin-watchdog实例和若干个resin-server实例;
</li>
<li>一个resin-server实例就是一个jvm, 每个jvm上运行多个webapp;
</li>
<li>每个resin-server都有规范的目录结构, 供webapp存放程序, 日志和生成的静态文件等;
</li>
<li>每个resin-server都对外启用jmx接口, 开发人员通过jmx监测并控制resin-server, 包括启动, 停止, 重启, 重新加载webapp等;
</li>
<li>webapp可以方便的部署到指定的resin-server实例, 对应的nginx转发规则也很简单;
</li>
</ul>

<a id="toc3" name="toc3"></a>
<h2>1.2. 关于jvm和webapp的说明</h2>

<ul>
<li>一个resin-server实例就是一个jvm, 每个jvm上运行多个webapp;
</li>
<li>一个jvm是吃不完现在服务器的内存和CPU资源的, 所以要跑多个, jvm多力量大;
</li>
<li>webapp就是javaweb应用, webapp内的所有jsp共享同一个application作用域;
</li>
<li>每个host都会有一个名为ROOT的webapp, 对应于host的根目录, 如http://example.17173.com/
</li>
<li>ROOT之外的webapp对应于host的二级目录, 假定webapp名为hello, 那么就是对应http://example.17173.com/hello/
</li>
<li>同一个jvm上的webapp可以属于不同host, 视配置而定;
</li>
</ul>

<a id="toc4" name="toc4"></a>
<h2>1.3. jvm及ftp用户命名规范</h2>

<p>
本文中以${jvm}表示jvm唯一标识, ${jvm}通过如下变换获得:
</p>

<ol>
<li>将域名去掉17173.com后缀;
</li>
<li>将剩下部分中[0-9a-z]之外的字符统一替换为"_";
</li>
<li>如果1,2步骤获取的jvm标识已经存在, 则再增加_jvm_xx后缀, 其中xx为01开始的数字序号
</li>
</ol>

<p>
对应ftp用户名为usr-${jvm}, 举例如下:
</p>

<dl>
<dt>域名: app-01.my.17173.com</dt><dd>
</dd>
</dl>

<ul>
<li>jvm标识符: app_01_my, app_01_my_jvm_01
</li>
<li>ftp用户名: usr-app_01_my, usr-app_01_my_jvm_01
</li>
</ul>

<dl>
<dt>域名: hao.17173.com</dt><dd>
</dd>
</dl>

<ul>
<li>jvm标识符: hao, hao_jvm_02
</li>
<li>ftp用户名: usr-hao, usr-hao_jvm_02
</li>
</ul>

<a id="toc5" name="toc5"></a>
<h2>1.4. jvm主目录结构说明</h2>

<p>
jvm的主目录为/home/javaweb/${jvm}, 假定域名为example.17173.com,
则${jvm}为example, jvm主目录为/home/javaweb/example.
</p>
<p>
下面以webapp名为hello为例介绍主目录下的文件夹:
</p>

<dl>
<dt>logs</dt><dd>
  <ul>
  <li>存放日志文件, 除了stdout.log和stderr.log, 其他文件应按webapp分别建立子文件夹存放
  </li>
  <li>样例: /home/javaweb/example/logs/hello/error.log
  </li>
  <li>对应url: N/A
  </li>
  <li>外网可访问: 否
  </li>
  <li>FTP可写: 否
  </li>
  </ul>
</dd>
<dt>private</dt><dd>
  <ul>
  <li>存放应用生成的数据文件, 文件应按webapp分开存放
  </li>
  <li>样例: /home/javaweb/example/private/hello/data.dat
  </li>
  <li>对应url: N/A
  </li>
  <li>外网可访问: 否
  </li>
  <li>FTP可写: 否
  </li>
  </ul>
</dd>
<dt>public</dt><dd>
  <ul>
  <li>存放应用生成的数据文件, 文件应按webapp分开存放
  </li>
  <li>样例: /home/javaweb/example/public/hello/index.html
  </li>
  <li>对应url: http://example.17173.com/public/hello/index.html
  </li>
  <li>外网可访问: 是
  </li>
  <li>FTP可写: 否
  </li>
  </ul>
</dd>
<dt>webapps</dt><dd>
  <ul>
  <li>存放应用文件, 文件应按webapp分开存放
  </li>
  <li>样例: /home/javaweb/example/webapps/hello/index.jsp
  </li>
  <li>对应url: http://example.17173.com/hello/index.jsp
  </li>
  <li>外网可访问: 是
  </li>
  <li>FTP可写: 是
  </li>
  </ul>
</dd>
<dt>WEB-INF</dt><dd>
  <ul>
  <li>Resin工作目录, 存放编译后的.jsp文件, 临时文件, session文件等, 文件应按webapp分开存放
  </li>
  <li>样例: /home/javaweb/example/WEB-INF/hello/work
  </li>
  <li>对应url: N/A
  </li>
  <li>外网可访问: 否
  </li>
  <li>FTP可写: 否
  </li>
  </ul>
</dd>
</dl>

<p>
如果应用包括需要人工维护(或者CMS推送)的静态页面, 则webapp的静态文件不能放在${jvm}里,
而应该使用其他账号单独部署, 如/home/httpd/html/example.17173.com/index.shtml,
然后在nginx中将server root指向对应目录.
</p>

<a id="toc6" name="toc6"></a>
<h1>2. 软件的安装</h1>

<a id="toc7" name="toc7"></a>
<h2>2.1. 安装nginx</h2>

<p>
待补充.
</p>
<p>
安装完之后直接将附件中的nginx.conf和javaweb.conf复制到nginx的conf目录, 
然后在conf目录中建立一个vhosts目录即可.
</p>

<a id="toc8" name="toc8"></a>
<h2>2.2. 安装JDK</h2>

<p>
安装到/opt/17173/java里, 比如/opt/17173/java/jdk1.6.0_17
</p>
<p>
link成/opt/17173/jdk:
</p>

<pre class="brush: bash">
ln -s /opt/17173/java/jdk1.6.0_17 /opt/17173/jdk
</pre>

<a id="toc9" name="toc9"></a>
<h2>2.3. 安装Resin</h2>

<ul>
<li>(如果整合apache必须带上--with-apxs=/opt/17173/apache2/bin/apxs)
</li>
<li>(如果是专业版, 安装完以后记得cp licenses/*.* 到安装目录下)
</li>
</ul>

<pre class="brush: bash">
tar -xvzf resin-pro-3.1.9.tar.gz
chmod +x ./configure
./configure --prefix=/opt/17173/resin --enable-64bit
make
make install
</pre>

<p>
安装完之后直接将附件中的resin.conf复制到resin的conf目录覆盖原文件即可.
</p>

<a id="toc10" name="toc10"></a>
<h2>2.4. 设定环境变量</h2>

<p>
添加以下到/etc/profile中:
</p>

<pre class="brush: bash">
export JAVA_HOME=/opt/17173/jdk
export RESIN_HOME=/opt/17173/resin
export CLASSPATH=.:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
</pre>

<p>
然后运行. /etc/profile重载环境变量, 之后就能用echo $JAVA_HOME以及java -version来验证安装结果.
</p>

<a id="toc11" name="toc11"></a>
<h2>2.5. 初始化目录</h2>

<p>
分别建立如下目录, 其中javaweb是各resin-server的父目录, jmxremote用于存放JMX的密码文件:
</p>

<pre class="brush: bash">
mkdir /home/javaweb
mkdir /home/jmxremote
</pre>

<a id="toc12" name="toc12"></a>
<h1>3. 配置实例: 新增加一个全新host和jvm</h1>

<p>
假定要添加的host为example.17173.com, 则按照<a href="#toc4">规则</a>可计算出: jvm标识为example, 用户名为usr-example.
</p>
<p>
并且在上面部署一个ROOT应用, 
</p>

<a id="toc13" name="toc13"></a>
<h2>3.1. 添加用户</h2>

<pre class="brush: bash">
useradd -d /home/javaweb/example -s /sbin/nologin usr-example
passwd usr-example
EIyM5xvctIOeEJJY
</pre>

<p>
vsftpd中把该用户加入可访问列表, 把其umask设定为022, 然后检查ftp是否可以访问.
</p>

<a id="toc14" name="toc14"></a>
<h2>3.2. 建立jvm和webapp目录结构</h2>

<p>
按照<a href="#toc5">目录结构规范</a>建立如下目录:
</p>

<pre class="brush: bash">
chmod 755 /home/javaweb/example
cd /home/javaweb/example
mkdir webapps -m 755
mkdir logs -m 755
mkdir private -m 755
mkdir public -m 755
mkdir WEB-INF -m 755
mkdir webapps/ROOT -m 755
mkdir logs/ROOT -m 755
mkdir private/ROOT -m 755
mkdir public/ROOT -m 755
chown -R usr-example.usr-example webapps
chown -R nobody.nobody logs
chown -R nobody.nobody private
chown -R nobody.nobody public
chown -R nobody.nobody WEB-INF
</pre>

<a id="toc15" name="toc15"></a>
<h2>3.3. 建立jmx密码文件</h2>

<p>
jmx密码文件名和jvm标识符一致, 扩展名为".password", 必须修改其所属和权限.
用户名是固定的，每个主机的.password文件都是controlRole这个用户名, 密码随机.
存盘后必须修改owner和权限以让配置生效.
</p>

<pre class="brush: bash">
cd /home/jmxremote
echo controlRole sSa8KOYX1ILVvWGs &gt; example.password
chown nobody.nobody example.password
chmod 600 example.password
</pre>

<p>
参考资料:
</p>

<ul>
<li><a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote">Monitoring and Management Using JMX</a>
</li>
<li><a href="http://aofengblog.blog.163.com/blog/static/6317021200871711013857/">JMX管理Tomcat/Resin</a>
</li>
</ul>

<a id="toc16" name="toc16"></a>
<h2>3.4. 在resin中添加相应配置</h2>

<a id="toc17" name="toc17"></a>
<h3>3.4.1. resin.conf配置</h3>

<p>
将以下配置追加到resin.conf尾部:
</p>

<pre class="brush: xml">
&lt;cluster id="example"&gt;
	&lt;server id="example" address="127.0.0.1" port="6800"&gt;
		&lt;http address="10.59.96.1" port="8080" /&gt;
		&lt;jvm-arg&gt;-Djava.rmi.server.hostname=10.59.96.1&lt;/jvm-arg&gt;
		&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote.port=9800&lt;/jvm-arg&gt;
		&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote.password.file=/home/jmxremote/example.password&lt;/jvm-arg&gt;
	&lt;/server&gt;
	
	&lt;host id="example.17173.com" root-directory="/home/javaweb/example"&gt;
		&lt;web-app id="/" root-directory="webapps/ROOT" redeploy-mode="manual"&gt;
			&lt;work-dir&gt;../../WEB-INF/ROOT/work&lt;/work-dir&gt;
			&lt;temp-dir&gt;../../WEB-INF/ROOT/temp&lt;/temp-dir&gt;
		&lt;/web-app&gt;
	&lt;/host&gt;
&lt;/cluster&gt;
</pre>

<p>
&lt;cluster&gt;和&lt;server&gt;的id都和jvm唯一标识相同.
1个&lt;cluster&gt;中的所有&lt;server&gt;是共享session的, 这个目前一般用不到, 所以暂时都是1个&lt;cluster&gt;只包括1个&lt;server&gt;.
&lt;server&gt;和&lt;host&gt;是多对多的, 自由组合.
</p>
<p>
端口配置说明:
</p>

<ul>
<li>resin-server和resin-watchdog通讯的端口从6800开始;
</li>
<li>resin-server的http端口从8080开始;
</li>
<li>resin-server的jmxremote端口从9800开始;
</li>
</ul>

<p>
要注意的是&lt;web-app&gt;的id, 当webapp部署为ROOT的时候, 其id只能为"/", 其他情况id为"/${webapp}";
</p>

<a id="toc18" name="toc18"></a>
<h3>3.4.2. 启动和关闭resin-server</h3>

<pre class="brush: bash">
# start resin-server
java -jar /opt/17173/resin/lib/resin.jar -server example start
# stop resin-server
java -jar /opt/17173/resin/lib/resin.jar -server example stop
</pre>

<p>
启动完之后, netstat应该看到相应端口都有进程开始监听.
</p>

<a id="toc19" name="toc19"></a>
<h2>3.5. 在nginx中添加相应配置</h2>

<a id="toc20" name="toc20"></a>
<h3>3.5.1. nginx.conf配置</h3>

<p>
在nginx.conf中追加upstream配置, 名称为proxy_${jvm}, 如下:
</p>

<pre class="brush: bash">
upstream proxy_example {
	server 10.59.96.1:8080;
}
</pre>

<a id="toc21" name="toc21"></a>
<h3>3.5.2. 添加host配置文件</h3>

<p>
然后在vhosts文件夹中追加一个新配置文件, 名称为example.17173.com.conf, 内容如下:
</p>

<pre class="brush: bash">
server {
	listen 10.59.96.1:80;
	listen 121.207.251.1:80;
	server_name example.17173.com;
	root /home/javaweb/example/webapps/ROOT;
	index index.html index.shtml index.jsp index.do index.action;
	access_log logs/example.17173.com_access.log main;
	# 错误页面按需设置
	# error_page 404 405 500 502 /error.html;
	
	if ($http_range) {
		return 403;
	}
	
	if ($host !~ .*(\.17173\.com)$)	{
		return 403;
	}
	
	# 指定jvm
	set $jvm "example";
	
	# 指定webapp
	set $webapp "ROOT";
	
	# webapp对应的路径, 如果是ROOT则为"", 否则是"/${webapp}"
	set $path "";
	
	# 用于配置非ROOT应用是否动静态文件分离, 默认为false,
	# 表示静态文件也在jvm的webapps目录里, 否则会指向/home/httpd/html/$server_name下对应的目录里.
	# ROOT应用通过直接指定server的root来配置.
	set $html false;
	
	# 包含通用设置进来
	include javaweb.conf;
}
</pre>

<a id="toc22" name="toc22"></a>
<h3>3.5.3. 关于javaweb.conf的说明</h3>

<p>
里面做了这么几件事:
</p>

<ol>
<li>屏蔽掉非内网IP对/admin或者/${webapp}/admin的访问;
</li>
<li>屏蔽掉对WEB-INF和META-INF文件夹的访问, 这些文件夹存放程序和配置文件;
</li>
<li>将.jsp|.do|.servlet|.action转发到resin-server;
</li>
<li>将/public/开头的请求定位到/home/javaweb/${jvm}/public/
</li>
<li>将/${webapp}/public/开头的请求rewrite成/public/${webapp}/
</li>
<li>如果$html为false, 将/${webapp}/开头的请求定位到/home/javaweb/${jvm}/webapps/${webapp}/
</li>
<li>如果$html为true, 将/${webapp}/开头的请求定位到/home/httpd/html/${webapp}/
</li>
</ol>

<a id="toc23" name="toc23"></a>
<h1>4. 配置实例: 新增加一个jvm</h1>

<p>
接上例, 现在要往example.17173.com部署一个名为hello的webapp, 并且要求跑在新的jvm上;
那么我们按<a href="#toc4">规则</a>计算出新的${jvm}为example_jvm_01, ftp用户名为usr-example_jvm_01.
</p>

<a id="toc24" name="toc24"></a>
<h2>4.1. 添加用户</h2>

<pre class="brush: bash">
useradd -d /home/javaweb/example_jvm_01 -s /sbin/nologin usr-example_jvm_01
passwd usr-example_jvm_01
vctIEIyM5xOeEJJY
</pre>

<p>
vsftpd中把该用户加入可访问列表, 把其umask设定为022, 然后检查ftp是否可以访问.
</p>

<a id="toc25" name="toc25"></a>
<h2>4.2. 建立jvm和webapp目录结构</h2>

<pre class="brush: bash">
chmod 755 /home/javaweb/example_jvm_01
cd /home/javaweb/example_jvm_01
mkdir webapps -m 755
mkdir logs -m 755
mkdir private -m 755
mkdir public -m 755
mkdir WEB-INF -m 755
mkdir webapps/hello -m 755
mkdir logs/hello -m 755
mkdir private/hello -m 755
mkdir public/hello -m 755
chown -R usr-example_jvm_01.usr-example_jvm_01 webapps
chown -R nobody.nobody logs
chown -R nobody.nobody private
chown -R nobody.nobody public
chown -R nobody.nobody WEB-INF
</pre>

<a id="toc26" name="toc26"></a>
<h2>4.3. 建立jmx密码文件</h2>

<pre class="brush: bash">
cd /home/jmxremote
echo controlRole sYX1ILSa8KOVvWGs &gt; example_jvm_01.password
chown nobody.nobody example_jvm_01.password
chmod 600 example_jvm_01.password
</pre>

<a id="toc27" name="toc27"></a>
<h2>4.4. 在resin中添加相应配置</h2>

<a id="toc28" name="toc28"></a>
<h3>4.4.1. resin.conf配置</h3>

<p>
将以下配置追加到resin.conf尾部:
</p>

<pre class="brush: xml">
&lt;cluster id="example_jvm_01"&gt;
	&lt;server id="example_jvm_01" address="127.0.0.1" port="6801"&gt;
		&lt;http address="10.59.96.1" port="8081" /&gt;
		&lt;jvm-arg&gt;-Djava.rmi.server.hostname=10.59.96.1&lt;/jvm-arg&gt;
		&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote.port=9801&lt;/jvm-arg&gt;
		&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote.password.file=/home/jmxremote/example_jvm_01.password&lt;/jvm-arg&gt;
	&lt;/server&gt;
	
	&lt;host id="example.17173.com" root-directory="/home/javaweb/example_jvm_01"&gt;
		&lt;web-app id="/hello" root-directory="webapps/hello" redeploy-mode="manual"&gt;
			&lt;work-dir&gt;../../WEB-INF/hello/work&lt;/work-dir&gt;
			&lt;temp-dir&gt;../../WEB-INF/hello/temp&lt;/temp-dir&gt;
		&lt;/web-app&gt;
	&lt;/host&gt;
&lt;/cluster&gt;
</pre>

<a id="toc29" name="toc29"></a>
<h3>4.4.2. 启动和关闭resin-server</h3>

<pre class="brush: bash">
# start resin-server
java -jar /opt/17173/resin/lib/resin.jar -server example_jvm_01 start
# stop resin-server
java -jar /opt/17173/resin/lib/resin.jar -server example_jvm_01 stop
</pre>

<a id="toc30" name="toc30"></a>
<h2>4.5. 在nginx中添加相应配置</h2>

<a id="toc31" name="toc31"></a>
<h3>4.5.1. nginx.conf配置</h3>

<p>
在nginx.conf中追加upstream配置, 名称为proxy_${jvm}, 如下:
</p>

<pre class="brush: bash">
upstream proxy_example_jvm_01 {
	server 10.59.96.1:8081;
}
</pre>

<a id="toc32" name="toc32"></a>
<h3>4.5.2. host.conf配置</h3>

<p>
打开vhosts文件夹的example.17173.com.conf, 添加如下代码在include javaweb.conf之前:
</p>

<pre class="brush: bash">
if ($uri ~ ^/(hello)/) {
	set $jvm "example_jvm_01";
	set $webapp $1;
	set $path /$1;
	set $html false;
}
</pre>

<a id="toc33" name="toc33"></a>
<h1>5. 配置实例: 往已有jvm添加新的webapp</h1>

<p>
继续接上例, 现在要往example.17173.com部署一个名为world的webapp, 并且要求跑在example_jvm_01上;
</p>

<a id="toc34" name="toc34"></a>
<h2>5.1. 建立webapp目录结构</h2>

<pre class="brush: bash">
cd /home/javaweb/example_jvm_01
mkdir webapps/world -m 755
mkdir logs/world -m 755
mkdir private/world -m 755
mkdir public/world -m 755
</pre>

<a id="toc35" name="toc35"></a>
<h2>5.2. resin.conf配置</h2>

<p>
将以下配置追加到example_jvm_01的&lt;host&gt;中:
</p>

<pre class="brush: xml">
&lt;web-app id="/world" root-directory="webapps/world" redeploy-mode="manual"&gt;
	&lt;work-dir&gt;../../WEB-INF/world/work&lt;/work-dir&gt;
	&lt;temp-dir&gt;../../WEB-INF/world/temp&lt;/temp-dir&gt;
&lt;/web-app&gt;
</pre>

<a id="toc36" name="toc36"></a>
<h2>5.3. nginx配置</h2>

<p>
修改vhosts中的example.17173.com.conf, 找到以下代码:
</p>

<pre class="brush: bash">
if ($uri ~ ^/(hello)/) {
	set $jvm "example_jvm_01";
	set $webapp $1;
	set $path /$1;
	set $html false;
}
</pre>

<p>
修改为:
</p>

<pre class="brush: bash">
if ($uri ~ ^/(hello|world)/) {
	set $jvm "example_jvm_01";
	set $webapp $1;
	set $path /$1;
	set $html false;
}
</pre>

<a id="toc37" name="toc37"></a>
<h1>6. 常用配置参数说明</h1>

<a id="toc38" name="toc38"></a>
<h2>6.1. resin常用配置参数说明</h2>

<a id="toc39" name="toc39"></a>
<h3>6.1.1. dependency-check-interval</h3>

<p>
生产服务器改为600s, 测试服务器2s.
</p>
<p>
Configures how often the environment context should be checked for changes.
Resin automatically checks each environment for updates, generally class or configuration updates.
Because these checks can take a considerable amount of time, deployment servers should use high values
like 60s or more while development machines will want low values like 2s.
The interval defaults to the parent's interval. So the web-app will default to the host's value.
</p>

<a id="toc40" name="toc40"></a>
<h3>6.1.2. resin-server: jvm参数</h3>

<pre class="brush: xml">
&lt;!-- 64位模式, 能在64位系统上大幅提升性能 --&gt;
&lt;jvm-arg&gt;-d64&lt;/jvm-arg&gt;
&lt;!-- JVM最大堆内存, 最大4G左右为宜 --&gt;
&lt;jvm-arg&gt;-Xmx4096m&lt;/jvm-arg&gt;
&lt;!-- JVM初始堆内存 --&gt;
&lt;jvm-arg&gt;-Xms4096m&lt;/jvm-arg&gt;
&lt;!-- Young内存大小, 不能太小回收太频繁, 不能太大, 太大GC的时候服务器卡, 一般总量的3/8合适 --&gt;
&lt;jvm-arg&gt;-Xmn1536m&lt;/jvm-arg&gt;
&lt;!-- 线程栈内存, 取默认值2m, resin文档说2m能满足绝大多数应用的需求 --&gt; 
&lt;jvm-arg&gt;-Xss2m&lt;/jvm-arg&gt;
&lt;!-- 生产服务器不要加上这个参数, 这个是调试用的 --&gt;
&lt;jvm-arg&gt;-Xdebug&lt;/jvm-arg&gt;
&lt;!-- 最大Perm内存, 丢.war上去的时候如果不重启server, 不会释放Perm代占的内存, 多丢几次就抛OutOfMemoryException --&gt;
&lt;jvm-arg&gt;-XX:MaxPermSize=512m&lt;/jvm-arg&gt;
&lt;!-- 启用jmx接口, 启用基于用户名和密码的身份验证 --&gt;
&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote&lt;/jvm-arg&gt;
&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote.ssl=false&lt;/jvm-arg&gt;
&lt;jvm-arg&gt;-Dcom.sun.management.jmxremote.authenticate=true&lt;/jvm-arg&gt;
</pre>

<a id="toc41" name="toc41"></a>
<h3>6.1.3. resin-server: 常规参数</h3>

<pre class="brush: xml">
&lt;memory-free-min&gt;100M&lt;/memory-free-min&gt;
&lt;thread-max&gt;512&lt;/thread-max&gt;
&lt;socket-timeout&gt;65s&lt;/socket-timeout&gt;
&lt;keepalive-max&gt;512&lt;/keepalive-max&gt;
&lt;keepalive-timeout&gt;15s&lt;/keepalive-timeout&gt;
</pre>

<a id="toc42" name="toc42"></a>
<h3>6.1.4. resin-server: 运行身份</h3>

<pre class="brush: xml">
&lt;user-name&gt;nobody&lt;/user-name&gt;
&lt;group-name&gt;nobody&lt;/group-name&gt;
</pre>

<a id="toc43" name="toc43"></a>
<h3>6.1.5. web-app: Session和Cookie配置</h3>

<pre class="brush: xml">
&lt;session-config&gt;
	&lt;session-max&gt;16000&lt;/session-max&gt;
	&lt;!-- session-timeout单位是分钟, 别弄错了 --&gt;
	&lt;session-timeout&gt;20&lt;/session-timeout&gt;
	&lt;enable-cookies&gt;true&lt;/enable-cookies&gt;
	&lt;enable-url-rewriting&gt;false&lt;/enable-url-rewriting&gt;
&lt;/session-config&gt;
&lt;!-- 启用HttpOnly Cookie以增强安全性 --&gt;
&lt;cookie-http-only /&gt;
</pre>

<p>
关于HttpOnly请参见<a href="http://www.owasp.org/index.php/HttpOnly">HttpOnly</a>
</p>

<a id="toc44" name="toc44"></a>
<h3>6.1.6. host: 日志配置</h3>

<pre class="brush: xml">
&lt;!-- 访问日志, 其中X-Real-IP是nginx带过来的客户端IP头 --&gt;
&lt;access-log path="logs/access.log"
	format='%h "%{X-Real-IP}i" %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
	rollover-period="1D" /&gt;
&lt;stderr-log path="logs/stderr.log" archive-format="stderr_%Y-%m-%d.log"
	rollover-period="1D" /&gt;
&lt;stdout-log path="logs/stdout.log" archive-format="stdout_%Y-%m-%d.log"
	rollover-period="1D" /&gt;
</pre>

<p>
最好弄个脚本定时压缩或清空日志文件.
</p>

<a id="toc45" name="toc45"></a>
<h3>6.1.7. 故障排查技巧</h3>

<p>
jvm启动不正常时, 注意查看resin主目录中log文件夹下的日志.
</p>

<a id="toc46" name="toc46"></a>
<h3>6.1.8. 参考文档</h3>

<p>
主要有以下几篇:
</p>

<ul>
<li><a href="http://www.caucho.com/resin-3.1/doc/virtual-host.xtp">Resin Virtual Host</a>
</li>
<li><a href="http://www.caucho.com/resin-3.1/doc/session-tags.xtp#session-config">Resin Session</a>
</li>
<li><a href="http://www.caucho.com/resin-3.1/doc/resin-clustering.xtp#persistent-store">Resin Session Persistent Store</a>
</li>
</ul>

<a id="toc47" name="toc47"></a>
<h2>6.2. nginx常用配置说明</h2>

<a id="toc48" name="toc48"></a>
<h2>6.3. 运行身份</h2>

<pre class="brush: bash">
user  nobody;
</pre>

<a id="toc49" name="toc49"></a>
<h2>6.4. access和error日志</h2>

<p>
error日志记得打开, 还要弄个脚本自动整理.
</p>

<a id="toc50" name="toc50"></a>
<h2>6.5. 设置proxy请求的header</h2>

<pre class="brush: bash">
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
</pre>

</div>
<!-- xhtml code generated by txt2tags 2.6 (http://txt2tags.org) -->
<!-- cmdline: txt2tags -i temp.txt -o temp.html -->
</body></html>
